From 5a602fc8fb8b6c41caaad6722357c1159c6e5aae Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 30 Nov 2009 10:47:36 +0000 Subject: [PATCH] libxenlight: add console command This patch adds "xl console" command similar to "xm console". Signed-off-by: Tomasz Wroblewski Signed-off-by: Keir Fraser Acked-by: Stefano Stabellini --- tools/libxl/libxl.c | 15 +++++++++++++ tools/libxl/libxl.h | 2 ++ tools/libxl/xl.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 825363f1dd..f6bb489776 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -472,6 +472,21 @@ int libxl_domain_destroy(struct libxl_ctx *ctx, uint32_t domid, int force) return 0; } +int libxl_console_attach(struct libxl_ctx *ctx, uint32_t domid, int cons_num) +{ + struct stat st; + const char *XENCONSOLE = "/usr/lib/xen/bin/xenconsole"; + char *cmd; + + if (stat(XENCONSOLE, &st) != 0) { + XL_LOG(ctx, XL_LOG_ERROR, "could not access %s", XENCONSOLE); + return ERROR_FAIL; + } + + cmd = libxl_sprintf(ctx, "%s %d --num %d", XENCONSOLE, domid, cons_num); + return (system(cmd) != 0) ? ERROR_FAIL : 0; +} + static char ** libxl_build_device_model_args(struct libxl_ctx *ctx, libxl_device_model_info *info, libxl_device_nic *vifs, diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 4021b015f1..ca8565c28d 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -266,6 +266,8 @@ int libxl_is_domain_dead(struct libxl_ctx *ctx, uint32_t domid, xc_dominfo_t *in int libxl_domain_pause(struct libxl_ctx *ctx, uint32_t domid); int libxl_domain_unpause(struct libxl_ctx *ctx, uint32_t domid); +int libxl_console_attach(struct libxl_ctx *ctx, uint32_t domid, int cons_num); + struct libxl_dominfo * libxl_domain_list(struct libxl_ctx *ctx, int *nb_domain); xc_dominfo_t * libxl_domain_infolist(struct libxl_ctx *ctx, int *nb_domain); diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c index 88771c6f6b..abb0e62f4c 100644 --- a/tools/libxl/xl.c +++ b/tools/libxl/xl.c @@ -711,6 +711,7 @@ static void help(char *command) printf(" pci-list list pass-through pci devices for a domain\n\n"); printf(" pause pause execution of a domain\n\n"); printf(" unpause unpause a paused domain\n\n"); + printf(" console attach to domain's console\n\n"); } else if(!strcmp(command, "create")) { printf("Usage: xl create [options] [vars]\n\n"); printf("Create a domain based on .\n\n"); @@ -738,9 +739,58 @@ static void help(char *command) } else if(!strcmp(command, "destroy")) { printf("Usage: xl destroy \n\n"); printf("Terminate a domain immediately.\n\n"); + } else if (!strcmp(command, "console")) { + printf("Usage: xl console \n\n"); + printf("Attach to domain's console.\n\n"); } } +void console(char *p, int cons_num) +{ + struct libxl_ctx ctx; + uint32_t domid; + + libxl_ctx_init(&ctx); + libxl_ctx_set_log(&ctx, log_callback, NULL); + + if (libxl_param_to_domid(&ctx, p, &domid) < 0) { + fprintf(stderr, "%s is an invalid domain identifier\n", p); + exit(2); + } + libxl_console_attach(&ctx, domid, cons_num); +} + +int main_console(int argc, char **argv) +{ + int opt = 0, cons_num = 0; + char *p = NULL; + + while ((opt = getopt(argc, argv, "hn:")) != -1) { + switch (opt) { + case 'h': + help("console"); + exit(0); + case 'n': + if (optarg) { + cons_num = strtol(optarg, NULL, 10); + } + break; + default: + fprintf(stderr, "option not supported\n"); + break; + } + } + if (optind >= argc) { + help("console"); + exit(2); + } + + p = argv[optind]; + + console(p, cons_num); + exit(0); +} + void pcilist(char *dom) { struct libxl_ctx ctx; @@ -1117,6 +1167,8 @@ int main(int argc, char **argv) main_pause(argc - 1, argv + 1); } else if (!strcmp(argv[1], "unpause")) { main_unpause(argc - 1, argv + 1); + } else if (!strcmp(argv[1], "console")) { + main_console(argc - 1, argv + 1); } else if (!strcmp(argv[1], "help")) { if (argc > 2) help(argv[2]); -- 2.30.2